#include <cstdlib>
#include <iostream>
#include <termios.h>
#include "src/Latar/Latar.h"
#include "src/Bidang/Bidang.h"
#include "src/Sel/Sel.h"
#include "src/Point/Point.h"

int main(){
    char pilihan='';
    Latar L;
    int i,Sudut;
    int mulai = 0;

    //meminta jumlah sudut
    cout <<"Masukkan kode bidang : "<< endl;
    cin >> Sudut;
    Point Arr[Sudut+5], Ubah[Sudut+5];

    //membuat bidang
    bool flag = true;
    do {
        for(i=0;i<Sudut;i++){
            cout << "Titik " << i+1 << " : ";
            cin >> x >> y;
            Arr[i].setPoint(x,y);
            if ((y < Arr[mulai].GetY())||((y == Arr[mulai].GetY())&&(x < Arr[mulai].GetX()))) mulai = i;
            flag = flag && L.CheckPoint(Arr[i]);
        }
        
        if (!flag) {
            cout<<"Ada titik yang terletak di luar batas"<<endl;
            cout<<"Batas koordinat adalah (0,0) sampai (19,39)"<<endl;
        }
    } while (!flag);

    if (Sudut == 2) {
        Sudut = 4;
        
        int x1 = Arr[0].GetX();
        int x2 = Arr[1].GetX();
        if (x1 > x2) {
            int temp = x1;
            x1 = x2;
            x2 = temp;
        }
        
        int y1 = Arr[0].GetY();
        int y2 = Arr[1].GetY();
        if (y1 > y2) {
            int temp = y1;
            y1 = y2;
            y2 = temp;
        }        
        
        Ubah[0].setPoint(x1,y1);
        Ubah[1].setPoint(x2,y1);
        Ubah[2].setPoint(x2,y2);
        Ubah[3].setPoint(x1,y2);
    } else {
        for (int i=0;i<Sudut;++i) {
            Ubah[i] = Arr[mulai];
            mulai = (mulai+1) % Sudut; 
        }
        Ubah[Sudut] = Ubah[0];
        
        int luas = 0;
        for (int i=0;i<Sudut;++i) {
            luas += (Ubah[i].GetX()*Ubah[i+1].GetY() - Ubah[i+1].GetX()*Ubah[i].GetY());
        }

        if (luas < 0) {
            int kiri = 1;
            int kanan = Sudut-1;
        
            while (kiri < kanan) {
                Point temp = Ubah[kiri];
                Ubah[kiri] = Ubah[kanan];
                Ubah[kanan] = temp;
                ++kiri;
                --kanan;
            }
        }
    }

    Bidang B(Sudut,Ubah);
    L.AddBidang(&B);

    //meminta opsi
       
    //loop
    while(pilihan!='Q') {
            cout <<"masukkan pilihan anda"<< endl;
        cout <<"1. tekan Q untuk exit."<<endl;
        cout <<"2. tekan E untuk menghapus isi bidang."<< endl;
        cout <<"3. tekan F untuk mengisi bidang dengan '*'."<< endl;
        cout <<"4. tekan C untuk menghitung rasio karakter/blank bidang-latar."<< endl;
        cout <<"5. tekan S untuk menghitung rasio blank/karakter bidang-latar."<< endl;
        cout <<"pilihan anda? ";
                
                // Black magic to prevent Linux from buffering keystrokes.
        struct termios t,n;
        tcgetattr(STDIN_FILENO, &t);
        n = t;
        t.c_lflag &= ~ICANON;
        tcsetattr(STDIN_FILENO, TCSANOW, &t);
        pilihan = cin.get();
        tcsetattr(STDIN_FILENO, TCSANOW, &n);
        
        switch(pilihan) {
        //case 'E':
        //    cout <<"mengkosongkan isi bidang"<< endl;
        //    L.ClearPaper(' ');
        //    L.();
        //break;
        case 'F':
            cout <<"Mengisi karakter blank Latar dengan '*'"<< endl;
            L.Draw('*');
        break;
        case 'C':
            L.Draw();
            cout <<"Rasio kepadatan karakter non-blank/blank bidang : "<< endl;
            L.ComputeC(' ');
        break;
        case 'S':
            L.Draw();
            cout <<"Rasio kepadatan karakter non-blank / luas latar : "<< endl;
            L.ComputeS(' ');
        break;
        }
    }

    cout <<"bye.."<< endl;
    return 0;
}